package com.lisynet.tools.mytools.utils;

import org.springframework.util.StringUtils;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 基于LocalDateTime的日期工具
 * @author lisy
 */
public class TimeUtil {
	 /**
     * 默认日期格式
     */
    private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";
    /**
     * 默认时区
     */
    private static final ZoneOffset DEFAULT_ZONE = ZoneOffset.of("+8");

    /**
     * 返回 STANDARD_FORMAT（yyyy-MM-dd HH:mm:ss） 格式的日期字符串
     * @return 日期字符串
     */
    public static String nowTime()
    {
        return nowTime(STANDARD_FORMAT);
    }

    /**
     * 返回特定格式的日期字符串
     * @param format  日期格式
     * @return 日期字符串
     */
    public static String nowTime(String format)
    {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return LocalDateTime.now(DEFAULT_ZONE).format(formatter);
    }

    /**
     * 获取时间戳（秒）
     * @return 时间戳（秒）
     */
    public static Long getTimeSecond()
    {
        return LocalDateTime.now().toEpochSecond(DEFAULT_ZONE);
    }

    /**
     * 获取时间戳（毫秒）
     * @return 时间戳（毫秒）
     */
    public static Long getMilliSecond()
    {
        return LocalDateTime.now().toInstant(DEFAULT_ZONE).toEpochMilli();
    }

    /**
     * string 字符串转date
     * @param time 日期类型
     * @return Date
     */
    public static Date StringToDate(String time){
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime dateTime = LocalDateTime.parse(time, df);
        return Date.from(dateTime.toInstant(DEFAULT_ZONE));
    }

    /**
     * 将字符串转成Long类型的时间戳，格式为：yyyy-MM-dd HH:mm:ss
     * @param time yyyy-MM-dd HH:mm:ss 形式的日期
     * @return 时间戳
     */
    public static Long convertTimeToLong(String time) {
        if(StringUtils.isEmpty(time)){
            return 0L;
        }
        DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime parse = LocalDateTime.parse(time, ftf);
        return LocalDateTime.from(parse).atZone(DEFAULT_ZONE).toInstant().toEpochMilli();
    }

    /**
     * 时间戳转时间字符串
     * @param time  时间戳
     * @return      yyyy-MM-dd HH:mm:ss
     */
    public static String convertTimeToString(Long time){
        DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time),DEFAULT_ZONE));
    }
}
